home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / CC_C / 0294.ZIP / SHELL2.ARC / CP.C < prev    next >
C/C++ Source or Header  |  1985-08-08  |  2KB  |  123 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <string.h>
  4. #include <sys\types.h>
  5. #include <sys\stat.h>
  6.  
  7.  
  8. #define Usage "usage: %s file1 file2\n\tor %s file1 file2 ... [dir|dev:]\n"
  9.  
  10. main( argc, argv )
  11. int    argc;
  12. char    * argv[];
  13.     {
  14.  
  15.     struct stat statb;
  16.     int    dir;
  17.     char * dest;
  18.     char    dbuf[256];
  19.     static char    buf[30*BUFSIZ];
  20.     int    ifd, ofd;
  21.     int cnt;
  22.     int mv;
  23.     char * pgm;
  24.     char * ptr;
  25.     int ident;
  26.  
  27.     pgm = argv[0];
  28.     if( argc < 3 )
  29.         {
  30.         usage:
  31.             fprintf( stderr, Usage, pgm, pgm );
  32.             exit(1);
  33.         }
  34.  
  35.     /*   is this "mv" or "cp"?  */
  36.     strlwr( pgm );
  37.     if( (ptr = strrchr( pgm, '\\' )) == NULL)
  38.         ptr = pgm;
  39.     else
  40.         ++ptr;
  41.     mv  =  (strcmp( ptr, "mv.exe" ) == 0)
  42.         || (strcmp( ptr, "mv" ) == 0);
  43.  
  44.  
  45.     /*   is this  cp a b, or cp a b c <dir/dev:>?  */
  46.     dest = argv[--argc];
  47.     if( (stat( dest, &statb ) == -1 
  48.        || !((statb.st_mode & S_IFDIR) 
  49.          || (strcmp( dest, "\\" ) == 0)))  /* msdos sucks  */
  50.        && !((strlen(dest) == 2) && (dest[1] == ':')) )
  51.         dir = 0;
  52.     else
  53.         dir = 1;
  54.  
  55.     if( strcmp( dest, "." ) == 0 )
  56.         ident  = 1;
  57.     else
  58.         ident = 0;
  59.  
  60.     if( (argc > 2) && !dir )
  61.         goto usage;
  62.  
  63.  
  64.     /*
  65.      *    move or copy all of the files on the arg list 
  66.      */
  67.     while( --argc )
  68.         {
  69.         ++argv;
  70.  
  71.         if( ident )
  72.             {
  73.             /*  I hate ms-dos  */
  74.             if( (ptr = strrchr( *argv, '\\' )) == NULL
  75.             &&  (ptr = strrchr( *argv, '/')) == NULL )
  76.                 {
  77.                 fprintf( stderr, "can't copy %s onto itself\n", *argv );
  78.                 exit( 1 );
  79.                 }
  80.             strcpy( dbuf, ptr+1 );
  81.             }
  82.         else
  83.         if( dir )
  84.             sprintf( dbuf, "%s\\%s", dest, *argv );
  85.         else
  86.             strcpy( dbuf, dest );
  87.  
  88.  
  89.         if( (ifd = open( *argv, O_RDONLY+O_BINARY )) < 0 )
  90.             {
  91.             perror( pgm );
  92.             exit(1);
  93.             }
  94.  
  95.         if( (ofd = open( dbuf, O_WRONLY+O_CREAT+O_TRUNC+O_BINARY, 0666 )) < 0 )
  96.             {
  97.             perror( pgm );
  98.             exit(1);
  99.             }
  100.  
  101.         while( (cnt = read( ifd, buf, sizeof(buf) )) > 0 )
  102.             {
  103.             if( (cnt = write( ofd, buf, cnt )) < 0 )
  104.                 break;
  105.             }
  106.         close(ifd);
  107.         close(ofd);
  108.  
  109.         if( cnt < 0 )
  110.             {
  111.             /*  I/O error */
  112.             perror( pgm );
  113.             exit( 1 );
  114.             }
  115.  
  116.         if( mv )
  117.             unlink( *argv );
  118.  
  119.         }
  120.  
  121.     exit(0);
  122.     }
  123.